<?php

namespace app\plus\controller;

use app\common\model\QueueModel;
use think\Queue;

class QueueController
{
    /**
     * 返回操作对应的方法
     * @param string $operate 操作名
     * @return string 对应方法的路径
     */
    protected function mapping($operate)
    {
        $list=cache('queueList');
        return $list[$operate];
    }

    /**
     * 添加队列
     * @param string $operate 操作名称，由mapping方法返回
     * @param array $data 所需数据，具体参数请查看对应方法的参数
     * @param bool $repeat 是否重复
     * @param int|bool $delay 不延时为null，或者延时多少秒
     * @param int|bool $first 首次执行时间
     * @param int|bool $delTime 到这个时间点后删除任务
     * @return bool 是否添加成功
     *
     * 在消费函数中，如果时间大于delTime删除任务,首先检测data下repeat函数，如果它是false则删除任务，
     * 否则检测delay如果是null则重新发布立即执行任务，否则重新发布延时任务
     *     public function fire(Job $job,$data){
     *          if ($data['delTime']&&time()>$data['delTime']){
     *              $job->delete();
     *          }
     *          $isJobDone = $this->refreshPromotion($data);
     *          if ($isJobDone) {
     *              if ($data['repeat']){
     *                  if ($data['delay']===null){
     *                      $job->release();
     *                  }else{
     *                      $job->release($data['delay']);
     *                  }
     *              }else{
     *                  $job->delete();
     *              }
     *          }else{
     *              if ($job->attempts() > 5) {
     *                  $job->failed();
     *              }else{
     *                  $job->release(10);
     *              }
     *         }
     *      }
     *
     */
    public function pushQueue($operate, $data, $repeat = false, $delay = null,$first=false, $delTime = false)
    {
        $jobHandlerClassName = $this->mapping($operate);
        $jobQueueName = "default";
        $jobData = $data;
        $jobData['repeat'] = $repeat;
        $jobData['delay'] = $delay;
        $jobData['delTime']=$delTime;
        if ($first) {
            $wait=$first-time();
            if ($wait<=0){
                $wait=0;
            }
            $isPushed = Queue::later($wait, $jobHandlerClassName, $jobData, $jobQueueName);
        } else {
            $isPushed = Queue::push($jobHandlerClassName, $jobData, $jobQueueName);
        }
        if ($isPushed !== false) {
            return true;
        } else {
            return false;
        }
    }


}